package com.laixu.cglib;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;

public class CGLIBTest {
    public static void main(String[] args) {
        // 1. 创建 Enhancer 对象（CGLIB核心类）
        Enhancer enhancer = new Enhancer();

        // 2. 设置目标类为父类
        enhancer.setSuperclass(StudentService.class);

        // 3. 设置回调方法拦截器
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(
                    Object proxy,         // 代理对象
                    Method method,        // 目标方法
                    Object[] args,       // 方法参数
                    MethodProxy methodProxy  // 方法代理（用于调用父类方法）
            ) throws Throwable {
                // 前置增强：开启事务
                System.out.println("开启事务");

                // 调用目标方法（通过 methodProxy.invokeSuper 调用父类方法）
                Object result = methodProxy.invokeSuper(proxy, args);

                // 后置增强：提交事务
                System.out.println("提交事务");

                return result;
            }
        });

        // 4. 创建代理对象
        StudentService studentService = (StudentService) enhancer.create();

        // 5. 调用代理方法
        studentService.saveOrUpdate();
    }
}